package handlers

import (
	"fmt"
	"log"
	"net/http"
	"path/filepath"
	"strings"

	"excel/database"
	"excel/models"

	"github.com/gin-gonic/gin"
	"github.com/xuri/excelize/v2"
)

// HandleFileUpload 处理文件上传请求
func HandleFileUpload(c *gin.Context) {
	username := c.GetHeader("X-Username")
	if username == "" {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "请先登录"})
		return
	}

	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文件上传失败"})
		return
	}

	// 检查文件扩展名
	ext := filepath.Ext(file.Filename)
	if ext != ".xlsx" && ext != ".xls" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "只支持 Excel 文件格式 (.xlsx, .xls)"})
		return
	}

	// 打开上传的文件
	src, err := file.Open()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "无法打开文件"})
		return
	}
	defer src.Close()

	// 读取 Excel 文件
	xlsx, err := excelize.OpenReader(src)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "无法读取 Excel 文件"})
		return
	}
	defer xlsx.Close()

	// 获取第一个工作表
	sheetName := xlsx.GetSheetName(0)
	rows, err := xlsx.GetRows(sheetName)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "无法读取工作表数据"})
		return
	}

	var tasks []models.ExcelData
	// 从第二行开始读取数据（跳过表头）
	for i, row := range rows {
		if i == 0 {
			continue // 跳过表头
		}

		// 获取任务名称，如果索引超出范围则设为空字符串
		taskName := ""
		if len(row) > 1 {
			taskName = strings.TrimSpace(row[1])
		}

		// 如果任务名称为空，跳过该行
		if taskName == "" {
			continue
		}

		// 安全地获取每一列的值
		getColumnValue := func(index int) string {
			if len(row) > index {
				value := strings.TrimSpace(row[index])
				if value == "" {
					return "/"
				}
				return value
			}
			return "/"
		}

		// 格式化日期
		formatDate := func(dateStr string) string {
			if dateStr == "/" {
				return "/" // 返回斜杠
			}

			// 如果日期中包含单个数字的月或日，补充前导零
			parts := strings.Split(strings.ReplaceAll(dateStr, "/", "-"), "-")
			if len(parts) == 3 {
				year := parts[0]
				month := parts[1]
				day := parts[2]

				// 补充月份的前导零
				if len(month) == 1 {
					month = "0" + month
				}
				// 补充日期的前导零
				if len(day) == 1 {
					day = "0" + day
				}

				// 重新组合日期字符串
				return fmt.Sprintf("%s-%s-%s", year, month, day)
			}

			return dateStr // 如果不需要格式化，直接返回原始值
		}

		task := models.ExcelData{
			TaskID:       getColumnValue(0),
			TaskName:     taskName,
			LiveRoomID:   getColumnValue(2),
			Date:         formatDate(getColumnValue(3)),
			StartTime:    getColumnValue(4),
			EndTime:      getColumnValue(5),
			TaskNature:   getColumnValue(6),
			TaskSource:   getColumnValue(7),
			TaskPriority: getColumnValue(8),
		}

		tasks = append(tasks, task)
	}

	// 将数据保存到数据库
	for _, task := range tasks {
		_, err := database.DB.Exec(`
			INSERT INTO edata (
				username, task_id, task_name, live_room_id, 
				date, start_time, end_time, task_nature, 
				task_source, task_priority
			) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
			username, task.TaskID, task.TaskName, task.LiveRoomID,
			task.Date, task.StartTime, task.EndTime, task.TaskNature,
			task.TaskSource, task.TaskPriority,
		)
		if err != nil {
			log.Printf("保存任务失败: %v", err)
			c.JSON(http.StatusInternalServerError, gin.H{"error": "保存数据失败"})
			return
		}
	}

	c.JSON(http.StatusOK, gin.H{
		"message": "文件上传成功",
		"total":   len(tasks),
		"data":    "数据已保存到数据库",
	})
}
